#!/bin/bash

: << 'COMMENT'
编写时间: 2025-03-18
编写人: 王杰民
修改人: 吴建波
编写功能: 该脚本用于redis服务的启动
         1 可进行服务端口号的动态配置，port_number
         2 启动后将压缩包删除，并备份
         3 启动端口号被占用时，提示是否将端口服务关闭后启动redis服务
COMMENT



# 常用配置设置
  # 定义压缩包文件名
  #REDIS_PACKAGE="redis504.tar.gz"
  REDIS_PACKAGE="redis.tar.gz"
  # 定义redis服务启动端口
  #port_number=6379
  port_number=6398

# 获取当前脚本所在目录
  #SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
  #REDIS_DIR="$SCRIPT_DIR/../0801-redis"
  script_path=$(pwd)
  file_path="$script_path/../0801-redis" #redis文件根目录
  conf_path="$file_path/redis/etc/redis.conf" #redis配置文件
  exe_path="$file_path/redis/bin/redis-server" #redis执行文件
  #echo $script_path,$file_path,$conf_path,$exe_path
  #exit 1


# redis压缩包解压缩
  # 检查文件是否存在
  cd $file_path #进入redis根路径
  if [ ! -f "$REDIS_PACKAGE" ]; then
    echo "错误: 文件 $REDIS_PACKAGE 不存在."
    exit 1
  fi
  # 解压缩文件
  echo "正在解压缩 $REDIS_PACKAGE ..."
  tar -xzvf "$REDIS_PACKAGE"
  # 检查解压是否成功
  if [ $? -eq 0 ]; then
    echo "解压缩成功."
  else
    echo "解压缩失败."
    exit 1
  fi
  #REDIS_PACKAGE="redis504.tar.gz"
  NAME_WITHOUT_EXT="${REDIS_PACKAGE%.tar.gz}"
  #echo "$NAME_WITHOUT_EXT"
  if [ $NAME_WITHOUT_EXT != "redis"  ]; then
    rm -rf redis
    cp -rf $NAME_WITHOUT_EXT redis
    rm -rf $NAME_WITHOUT_EXT
  fi
  cp -rf $REDIS_PACKAGE "$REDIS_PACKAGE-$(date +"%Y%m%d.%H%M.%S")"
  # redis启动端口号修改
  # 检查配置文件是否存在
    REDIS_CONF=$conf_path
    # 检查配置文件是否存在
    if [ ! -f "$REDIS_CONF" ]; then
      echo "错误: 文件 $REDIS_CONF 不存在."
      exit 1
    fi
    # 获取动态端口号
    PORT=$port_number
    # 修改端口号
    echo "正在修改端口号为 $PORT ..."
    sed -i 's/^#*port[[:space:]]*[0-9]*/port '"$PORT"'/' "$REDIS_CONF"
    # 检查修改是否成功
    if grep -q "^port[[:space:]]*$PORT" "$REDIS_CONF"; then
      echo "端口号修改成功."
    else
      echo "端口号修改失败."
      exit 1
    fi
# redis服务启动
  # Redis 配置
  REDIS_PORT=$port_number
  REDIS_SERVER=$exe_path
  REDIS_CONF=$conf_path
  # 检查端口是否被占用
  check_port() {
      echo "检查端口 $REDIS_PORT 是否被占用..."
      if lsof -i :$REDIS_PORT > /dev/null 2>&1; then
          echo "端口 $REDIS_PORT 被占用。"
          return 0
      else
          echo "端口 $REDIS_PORT 未被占用。"
          return 1
      fi
  }

  # 杀死占用端口的进程
  kill_port_process() {
      #杀死端口号进程确认
      echo "尝试杀死占用端口 $REDIS_PORT 的进程..."
      PID=$(lsof -ti :$REDIS_PORT)
      # 显示占用端口的进程信息
      echo "以下进程占用了端口 $REDIS_PORT："
      ps -p $PID -o pid=,comm=,user=

      # 提示用户确认
      read -p "是否要杀死这些进程？(y/n): " CONFIRM
      # 根据用户输入执行操作
      if [ "$CONFIRM" = "y" ] || [ "$CONFIRM" = "Y" ]; then
        echo "正在杀死进程..."
        kill -9 $PID
        echo "进程已被杀死。"
      else
        echo "操作已取消。"
        echo "请手动设置修改Redis启动服务端口号后再进行启动操作，端口号$REDIS_PORT已被占用"
        exit 1
      fi
  }

  # 修改 Redis 可执行文件权限
  modify_permissions() {
      echo "修改 $REDIS_SERVER 的权限..."
      chmod +x $REDIS_SERVER
      if [ $? -eq 0 ]; then
          echo "权限修改成功。"
      else
          echo "权限修改失败。"
          kill $$
      fi
  }

  # 启动 Redis 服务
  start_redis() {
      echo "启动 Redis 服务..."
      $REDIS_SERVER $REDIS_CONF &
      if [ $? -eq 0 ]; then
          echo "Redis 服务启动成功。"
      else
          echo "Redis 服务启动失败。"
          exit 1
      fi
  }

  # 验证 Redis 服务是否启动
  verify_redis() {
      echo "验证 Redis 服务是否启动..."
      if lsof -i :$REDIS_PORT > /dev/null 2>&1; then
          echo "Redis 服务已成功启动并监听端口 $REDIS_PORT。"
      else
          echo "Redis 服务未启动。"
          exit 1
      fi
  }

  # 主流程
  if check_port; then
      kill_port_process
  fi
  modify_permissions
  start_redis
  verify_redis






exit 1


















# 进入redis目录
cd "$REDIS_DIR" || { echo "无法进入redis目录: $REDIS_DIR"; exit 1; }

# 找到并解压 .tar.gz 文件
TAR_GZ_FILE=$(ls *.tar.gz 2>/dev/null)
if [ -z "$TAR_GZ_FILE" ]; then
  echo "在 $REDIS_DIR 目录下未找到 .tar.gz 文件"
  exit 1
fi
tar -xzf "$TAR_GZ_FILE" || { echo "解压失败"; exit 1; }

# 获取解压后的目录名（假设只有一个解压目录）
EXTRACTED_DIR=$(ls -d */)
cd "$EXTRACTED_DIR" || { echo "无法进入解压后的目录: $EXTRACTED_DIR"; exit 1; }

# 进入bin目录
cd bin || { echo "无法进入bin目录"; exit 1; }

# 检查6379端口是否被占用
if netstat -tuln | grep -q ':$port_number '; then
  # 端口被占用，尝试ping redis-cli
  RESPONSE=$(./redis-cli ping 2>/dev/null)
  if [ "$RESPONSE" == "PONG" ]; then
    echo "Redis服务已经启动"
  else
    echo "请手动修改端口号再次执行"
    exit 1
  fi
else
  # 端口未被占用，启动redis-server
  ./redis-server ../etc/redis.conf &> /dev/null &
  sleep 2  # 等待redis-server启动

  # 再次ping redis-cli
  RESPONSE=$(./redis-cli ping 2>/dev/null)
  if [ "$RESPONSE" == "PONG" ]; then
    echo "redis已启动成功"
  else
    echo "redis启动失败，请排查"
    exit 1
  fi
fi